package com.cainli.image;

import java.io.File;
import java.util.HashMap;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.util.DisplayMetrics;

/**
 * URLDrawable的配置参数
 * 
 *
 */
// TODO 加一个通道绘图的Drawable

public class URLDrawableParams
{
    /**
     * 使用AsyncTask作为异步任务
     */
    public static final int TASK_TYPE_ASYNC_TASK = 0;
    /**
     * 使用SwingWorker作为异步任务
     */
    public static final int TASK_TYPE_SWING_WORKER = 1;
    
    /**
     * 默认的density
     */
    int mDeviceDensity = DisplayMetrics.DENSITY_DEFAULT;
    /**
     * 内存缓存大小, 默认值为5M;
     */
    int mMemoryCacheSize = 5 * 1024 * 1024;
    
    /**
     * MemoryCache, 如果不为null, 则使用此MemoryCache
     */
    MemoryCache mMemoryCache = null;
    
    /**
     * 文件缓存大小, 默认为20m
     */
    int mDiskCacheSize = 20* 1024 *1024;
    
    /**
     * 缓存文件路径, 默认为以当前packageName为文件名
     */
    File mDiskCachePath;
    
    /**
     * 使用的何种异步任务加载图片, 默认为TASK_TYPE_ASYNC_TASK
     */
    int mTaskType = TASK_TYPE_ASYNC_TASK;
    /**
     *  是否使用nativeDecode, 设置为true则不占用HEAP内存, 默认值为false<br>
     *  该值在3.0以上系统无效
     *  
     */
    // TODO NativeDecode暂时还没实现..
    boolean mIsNativeDecode = false;
    
    /**
     * 是否采用渐现方式显示图片
     */
    boolean mFadeInImage = true;
    
    /**
     * 是否播放gif动画, 设置为false则只显示第一帧
     */
    boolean mUseGifAnimation = true;
    
    /**
     * loading时的图片(drawable)
     */
    Drawable.ConstantState mLoadingDrawable;
    
    /**
     * 图片加载失败时的图片(drawable)
     */
    Drawable.ConstantState mFailedDrawable;
    
    /**
     * 解bitmap所使用的config
     */
    Bitmap.Config mConfig = Bitmap.Config.ARGB_8888;
    
    /**
     * 图片是否根据设备的density进行缩放, 默认为true
     */
    boolean mAutoScaleByDensity = true;
    
    HashMap<String, ProtocolDownloader> mDownLoaderMap = new HashMap<String, ProtocolDownloader>();
    
    /**
     * 用来计算samplesize的width. 超过此值2倍的图片将被缩放
     */
    int mReqWidth;
    /**
     * 用来计算samplesize的height. 超过此值2倍的图片将被缩放
     */
    int mReqHeight;
    
    /**
     * 构造函数
     * @param context
     * @param loadingDrawable loading时的图片
     * @param failedDrawable 失败时的图片
     */
    public URLDrawableParams(Context context, int loadingDrawable, int failedDrawable)
    {
        this(context, context.getResources().getDrawable(loadingDrawable), context.getResources().getDrawable(failedDrawable));
    }
    
    public URLDrawableParams(Context context,Drawable loadingDrawable, Drawable failedDrawable)
    {
        if(loadingDrawable == null || failedDrawable == null)
        {
            throw new IllegalArgumentException("loadingDrawable or failedDrawable can't be null");
        }
        mDeviceDensity = context.getResources().getDisplayMetrics().densityDpi;
        
        // sample size 设置为屏幕分辨率的0.6倍, 即长或宽超过屏幕分辨率1.2倍的图片将被雅俗
        // 长或者宽超过屏幕宽度的1.5倍将会被缩放
        // 4.0硬件加速的话, 图片大小的限制, 推测为长或宽不能超过屏幕长度的两倍(在1024*768的机器上, 为2048x2048)
        mReqWidth = context.getResources().getDisplayMetrics().widthPixels;
        mReqHeight = context.getResources().getDisplayMetrics().heightPixels;
        
        mDiskCachePath = Utils.getExternalCacheDir(context);
        mLoadingDrawable = loadingDrawable.getConstantState();
        mFailedDrawable = failedDrawable.getConstantState();
        mDownLoaderMap.put("http", new HttpDownloader());
        mDownLoaderMap.put("https", new HttpDownloader());
        mDownLoaderMap.put("file", new LocaleFileDownloader());
    }

    /**
     * 设置内存缓存大小(单位:字节),
     * 默认为5M
     * @param mMemoryCacheSize
     */
    public void setMemoryCacheSize(int mMemoryCacheSize)
    {
        this.mMemoryCacheSize = mMemoryCacheSize;
    }

    /**
     * 设置文件缓存的大小(单位:字节),
     * 默认为15m小时
     * 
     * @param diskCacheSize
     */
    public void setDiskCacheSize(int diskCacheSize)
    {
        this.mDiskCacheSize = diskCacheSize;
    }

    /**
     * 设置文件缓存路径
     * @param diskCachePath 文件缓存路径
     */
    public void setDiskCachePath(File diskCachePath)
    {
        this.mDiskCachePath = diskCachePath;
    }

    /**
     * 设置异步下载图片所使用的Task, 值为TASK_TYPE_ASYNC_TASK或TASK_TYPE_SWING_WORKER
     * 默认为TASK_TYPE_ASYNC_TASK
     * @param mTaskType
     */
    public void setmTaskType(int mTaskType)
    {
        this.mTaskType = mTaskType;
    }

    /**
     * 设置是否使用nativeDecode.设置为true则图片不会占用heap内存, Android3.0以上系统无效
     * 
     * @param mIsNativeDecode
     */
    public void setmIsNativeDecode(boolean mIsNativeDecode)
    {
        this.mIsNativeDecode = mIsNativeDecode;
    }

    /**
     * 设置加载完成后是否使用Fade-in方式显示图片
     * @param mFadeInBitmap
     */
    public void setmFadeInImage(boolean mFadeInImage)
    {
        this.mFadeInImage = mFadeInImage;
    }
        
    /**
     * 是否播放gif动画
     * @param mUseGifAnimation
     */
    public void setUseGifAnimation(boolean mUseGifAnimation)
    {
        this.mUseGifAnimation = mUseGifAnimation;
    }
    
    /**
     * 设置decode图片时的config
     * @param mConfig
     */
    public void setConfig(Bitmap.Config mConfig)
    {
        this.mConfig = mConfig;
    }
    
    /**
     * 添加特殊协议的下载器, 默认已实现http协议和file协议
     * @param protocol 协议名
     * @param downloader 对应的下载器
     */
    public void addProtocolDownloader(String protocol, ProtocolDownloader downloader)
    {
        mDownLoaderMap.put(protocol.toLowerCase(), downloader);
    }
    
    /**
     * 设置是否根据density自动缩放图片, 默认为true
     * @param mAutoScaleByDensity
     */
    public void setAutoScaleByDensity(boolean mAutoScaleByDensity)
    {
        this.mAutoScaleByDensity = mAutoScaleByDensity;
    }
    
    public void setMemoryCache(MemoryCache mMemoryCache)
    {
        this.mMemoryCache = mMemoryCache;
    }
}